package eleventh.观察者设计模式;

import java.util.Observable;
import java.util.Observer;

/**
 * 在java.util包中提供了Observable类和Observe接口，使用它们就可以实现观察者模式。
 * 被观察的类必须继承Observable类；
 * 该类的常用方法有：
 * addObserver(Observer o)：添加一个观察者
 * deleteObserver(Observer o)：删除一个观察者
 * setChanged()：被观察者状态发生变化
 * notifyObservers(Object arg)：通知所有观察者状态改变
 * 然后每一个观察者都需要实现以下接口：
 * public interface Observer{
 *     void update(Observable o,Object arg);
 * }
 * 在此接口中定义了一个update()方法，第一个参数表示被观察者实例，
 * 第二个参数表示修改的内容
 */
//观察者要实现Observe接口
// 被观察者要继承Observable类
    class House extends Observable{
        private float price;

    public House(float price) {
        this.price = price;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        //设置变化点
        super.setChanged();
        //通知所有观察者价格改变
        super.notifyObservers(price);
        this.price = price;
    }

    @Override
    public String toString() {
        return "房子价格："+this.price;
    }
}
    class HouseObserver implements Observer {
        private String name;

        public HouseObserver(String name) {
            this.name = name;
        }

        @Override
        public void update(Observable o, Object arg) {
            if(arg instanceof Float){//判断参数类型
                System.out.print(this.name+"观察到价格更改为：");
                System.out.println(((Float) arg).floatValue());
            }
        }
    }

public class 观察者模式的实现 {
    public static void main(String[] args) {
        House house = new House(100000f);
        HouseObserver a = new HouseObserver("买房人A");
        HouseObserver b = new HouseObserver("买房人B");
        HouseObserver c = new HouseObserver("买房人C");
        //加入观察者
        house.addObserver(a);
        house.addObserver(b);
        house.addObserver(c);
        System.out.println(house);//输出房子价格
        //修改房子价格
        house.setPrice(666666);
        System.out.println(house);

    }
}
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=58179:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 eleventh.观察者设计模式.观察者模式的实现
房子价格：100000.0
买房人C观察到价格更改为：666666.0
买房人B观察到价格更改为：666666.0
买房人A观察到价格更改为：666666.0
房子价格：666666.0

Process finished with exit code 0

 */